<?php

declare(strict_types=1);

namespace app\command;

use chillerlan\QRCode\Common\EccLevel;
use chillerlan\QRCode\Data\QRMatrix;
use chillerlan\QRCode\Output\QRFpdf;
use chillerlan\QRCode\Output\QRGdImagePNG;
use chillerlan\QRCode\Output\QRGdImageWEBP;
use chillerlan\QRCode\Output\QRImagick;
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;

use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Exception;

class GenSql extends Command
{
    protected function configure()
    {
        $this->setName('gen:sql')
            ->addOption('input', 'i', Option::VALUE_OPTIONAL, '输入Excel文件路径', '/www/wwwroot/www.yimin.com/app/command/persontiey.xlsx')
            ->addOption('output', 'o', Option::VALUE_OPTIONAL, '输出SQL文件路径', '/www/wwwroot/www.yimin.com/app/command/questions.sql')
            ->setDescription('从Excel生成九型人格题目的SQL文件');
    }

    protected function execute(Input $input, Output $output)
    {
        //生成题库sql
        // $this->extractLetter($input,$output);
        // 生成九型人格类型数据
        //  $this->genEnneagramTypes($input, $output);
        // $t = new ErWeiMa();

        $qrcode = $this->genImageRCode('www.baidu.com');

        // header('Content-Type: text/plain');
        // echo $qrcode;  // 直接输出base64编码的图片数据
    }

    private function genImageRCode($text, $savePath = '/www/wwwroot/www.yimin.com/public/qrcodes/')
    {
        // mb_internal_encoding('UTF-8');
        $options = new QROptions;
        $options->outputInterface = QRGdImagePNG::class;
        $options->outputType = QRCode::OUTPUT_IMAGE_PNG;
        $options->outputBase64 = false;
        $options->scale = 10;
        $options->width = 256;
        $options->height = 256;
        $options->bgColor = [0, 0, 0];  // 背景色
        $options->fgColor = [79, 162, 255];        // 前景色（黑色）
        $options->imageTransparent = false;    // 确保不透明
        $options->eccLevel = EccLevel::H;


        // 确保目录存在
        if (!is_dir($savePath)) {
            mkdir($savePath, 0755, true);
        }

        // 生成唯一文件名
        $filename = md5($text . time()) . '.png';
        $filePath = $savePath . $filename;

        try {
            // 生成并保存二维码
            // $qrcode = new QRCode($options);
            (new QRCode($options))->render($text, $filePath);

            if (!file_exists($filePath) || filesize($filePath) === 0) {
                throw new Exception('二维码生成失败');
            }

            return $filePath;
        } catch (Exception $e) {
            throw new Exception('生成二维码时出错: ' . $e->getMessage());
        }
    }

    private function genBase64QRCode($text)
    {
        $options = new QROptions();
        $options->outputInterface = QRGdImagePNG::class;
        $options->outputBase64 = true;  // 启用base64输出
        $options->version = 7;
        $options->scale = 5;
        $options->margin = 2;
        $options->width = 256;
        $options->height = 256;
        $options->imageTransparent = true;
        $options->drawCircularModules = true;
        $options->eccLevel = EccLevel::H;
        $options->imageTransparentColor = '#ffffff';

        // 生成二维码并输出base64
        return (new QRCode($options))->render($text);
    }
    private function genEnneagramTypes($input, $output)
    {
        $outputFile = $input->getOption('output');
        // 修改输出文件名，避免覆盖题目SQL
        $outputFile = str_replace('questions.sql', 'enneagram_types.sql', $outputFile);

        $output->writeln("开始生成九型人格类型数据");
        $output->writeln("输出SQL文件: {$outputFile}");

        try {
            // $sqlHeader .= "CREATE TABLE IF NOT EXISTS `ba_enneagram_types` (
            //     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
            //     `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '状态:0=禁用,1=启用',
            //     `create_time` BIGINT(16) UNSIGNED NULL DEFAULT NULL COMMENT '创建时间',
            //     `update_time` BIGINT(16) UNSIGNED NULL DEFAULT NULL COMMENT '修改时间',
            //     `type` ENUM('1','2','3','4','5','6','7','8','9') NOT NULL COMMENT '九种数字人格类型' COLLATE 'utf8mb4_unicode_ci',
            //     `name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '人格名称' COLLATE 'utf8mb4_unicode_ci',
            //     `description` TEXT NOT NULL COMMENT '人格简介' COLLATE 'utf8mb4_unicode_ci',
            //     `strengths` TEXT NOT NULL COMMENT '人格优势，强项，长处' COLLATE 'utf8mb4_unicode_ci',
            //     `suggestions` TEXT NOT NULL COMMENT '建议' COLLATE 'utf8mb4_unicode_ci',
            //     `other` TEXT NOT NULL COMMENT '其他描述' COLLATE 'utf8mb4_unicode_ci',
            //     PRIMARY KEY (`id`) USING BTREE
            // )
            // COMMENT='九型人格类型定义'
            // COLLATE='utf8mb4_unicode_ci'
            // ENGINE=InnoDB
            // ROW_FORMAT=DYNAMIC;\n\n
            // 准备SQL语句
            $sqlHeader = "";

            $sqlInserts = [];
            $currentTime = time();

            // 获取九型人格数据
            $enneagramTypes = $this->getEnneagramTypes();

            // 生成插入语句
            foreach ($enneagramTypes as $type) {
                // 处理strengths数组，确保换行符正确
                $strengths = implode(PHP_EOL, $type['strengths']);

                // 处理suggestions数组，确保换行符正确
                $suggestions = implode(PHP_EOL, $type['suggestions']);

                $sqlInserts[] = sprintf(
                    "INSERT INTO `ba_enneagram_types` (`status`, `create_time`, `update_time`, `type`, `name`, `description`, `strengths`, `suggestions`, `other`) VALUES
                    (1, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s');",
                    $currentTime,
                    $currentTime,
                    addslashes($type['type']),
                    addslashes($type['name']),
                    addslashes($type['description']),
                    addslashes($strengths),
                    addslashes($suggestions),
                    addslashes('') // 其他描述，默认为空JSON对象
                );
            }

            // 组合完整SQL
            $fullSql = $sqlHeader . implode("\n", $sqlInserts);

            // 写入文件
            file_put_contents($outputFile, $fullSql);

            $output->writeln("<info>九型人格类型SQL文件已成功生成: {$outputFile}</info>");
            return 0;
        } catch (Exception $e) {
            $output->writeln("<error>处理失败: " . $e->getMessage() . "</error>");
            return 1;
        }
    }
    private function getEnneagramTypes()
    {
        return [
            [
                'type' => '1',
                'name' => '完美型',
                'description' => '完美型的人理性正直，追求进步，力图把每件事都做得尽善尽美，希望自己和他人都能不断进步。',
                'strengths' => ['追求完美，对自己和他人要求严格', '有强烈的道德感和责任感', '注重细节，做事有条理', '容易看到错误和不足', '内心常有自我批评'],
                'suggestions' => [
                    '学会接受不完美，理解完美是相对的',
                    '培养对自己和他人的宽容心',
                    '适当放松标准，享受过程而非只关注结果',
                    '学习区分重要和不重要的细节',
                ],
            ],
            [
                'type' => '2',
                'name' => '助人型',
                'description' => '助人型的人慷慨大方，乐于助人，渴望被爱和被需要，常常将他人的需求置于自己之上。',
                'strengths' => [
                    '富有同情心，善于理解他人需求',
                    '乐于付出，常常忽视自己的需要',
                    '渴望被爱和被需要',
                    '有时会过度介入他人的生活',
                    '情感丰富，善于表达关怀',
                ],
                'suggestions' => ['学会平衡给予和接受的关系', '关注并表达自己的需求', '建立健康的界限，避免过度付出', ' recognizes self value not dependent on others'],
            ],
            [
                'type' => '3',
                'name' => '成就型',
                'description' => '成就型的人注重效率，追求成功，渴望被认可和赞赏，常常以成就来衡量自我价值。',
                'strengths' => [
                    '目标导向，注重效率和结果',
                    '适应能力强，善于自我调整',
                    '渴望成功和被认可',
                    '有时会忽视情感和人际关系',
                    '形象意识强，注重外在表现',
                ],
                'suggestions' => ['关注内在价值而非外在成就', '培养真诚的人际关系', '学会接受失败和挫折', '平衡工作和生活，关注情感需求'],
            ],
            [
                'type' => '4',
                'name' => '自我型',
                'description' => '自我型的人敏感细腻，富有创造力，渴望独特性和深度，常常沉浸在情感和想象中。',
                'strengths' => ['情感丰富，富有创造力', '追求独特性和真实性', '对美和深度有强烈感知', '情绪波动较大', '有时会感到与他人不同'],
                'suggestions' => ['培养情绪管理能力', '平衡理想与现实', ' recognizes 平凡中的美', '通过艺术表达释放情感'],
            ],
            [
                'type' => '5',
                'name' => '思考型',
                'description' => '思考型的人理性客观，善于分析，渴望知识和理解，常常保持情感上的距离。',
                'strengths' => ['求知欲强，善于分析和思考', '注重隐私和个人空间', '情感上保持一定距离', '观察多于参与', '对复杂问题有深入理解'],
                'suggestions' => ['更多地参与实际生活', '表达情感和想法', '平衡思考与行动', '与他人分享知识和见解'],
            ],
            [
                'type' => '6',
                'name' => '忠诚型',
                'description' => '忠诚型的人忠诚可靠，注重安全，常常考虑潜在的危险和问题，寻求支持和确定性。',
                'strengths' => ['忠诚可靠，责任感强', '考虑问题全面，预见潜在风险', '寻求安全感和确定性', '有时会过度担忧', '对权威有矛盾心理'],
                'suggestions' => ['培养对不确定性的容忍度', '区分真实和想象的威胁', '建立自信心', '平衡怀疑和信任'],
            ],
            [
                'type' => '7',
                'name' => '活跃型',
                'description' => '活跃型的人乐观开朗，追求快乐，渴望多样性和新体验，常常逃避痛苦和限制。',
                'strengths' => [' optimistic 积极，充满活力', '追求多样性和新体验', '善于看到可能性', '有时会逃避痛苦和限制', '思维跳跃，兴趣广泛'],
                'suggestions' => ['培养专注力和持久性', '面对而非逃避困难', '平衡快乐与责任', '深入发展某些领域'],
            ],
            [
                'type' => '8',
                'name' => '领袖型',
                'description' => '领袖型的人果断自信，保护他人，渴望控制和影响，常常表现出强势和直接。',
                'strengths' => ['果断自信，行动力强', '保护弱小，伸张正义', '渴望控制和自主权', '直接坦率，有时显得强势', '厌恶被控制和软弱'],
                'suggestions' => ['培养耐心和倾听能力', '适当展现脆弱性', '平衡力量与温柔', '考虑他人感受和需求'],
            ],
            [
                'type' => '9',
                'name' => '和平型',
                'description' => '和平型的人平和包容，避免冲突，渴望和谐与舒适，常常顺应他人和现状。',
                'strengths' => ['平和包容，善于调解', '避免冲突，寻求和谐', '顺应他人和现状', '有时会忽视自己的需求', '行动缓慢，优柔寡断'],
                'suggestions' => ['表达自己的观点和需求', '培养决断力和行动力', ' recognizes 冲突有时是必要的', '平衡他人需求与自我需求'],
            ]
        ];
    }

    private function extractLetter($input, $output)
    {
        $excelFile = $input->getOption('input');
        $outputFile = $input->getOption('output');

        $output->writeln("开始处理Excel文件: {$excelFile}");
        $output->writeln("输出SQL文件: {$outputFile}");

        try {
            // 1. 加载Excel文件
            $spreadsheet = IOFactory::load($excelFile);
            $sheet = $spreadsheet->getActiveSheet();

            // 2. 准备SQL语句容器
            // CREATE TABLE IF NOT EXISTS ba_enneagram_questions (
            //     id INT PRIMARY KEY,
            //     title TEXT,
            //     option_a_text TEXT,
            //     option_a_type INT,
            //     option_a_weight INT,
            //     option_b_text TEXT,
            //     option_b_type INT,
            //     option_b_weight INT
            // );\n\n
            $sqlHeader = "";
            $sqlInserts = [];
            // enum('1','2','3','4','5','6','7','8','9')
            // 3. 遍历每一行数据（跳过标题行）
            foreach ($sheet->getRowIterator(2) as $row) { // 从第2行开始
                $cellIterator = $row->getCellIterator();
                $cellIterator->setIterateOnlyExistingCells(true);

                // 提取单元格数据
                $data = [];
                foreach ($cellIterator as $cell) {
                    $data[] = $cell->getValue();
                }

                if (count($data) < 5) continue; // 跳过不完整行

                // 处理数据
                // var_dump($data[1]);  // 移除调试代码
                $questionNumber = (int)$data[0];

                // 处理可能是RichText对象的情况
                $optionAText = $data[1];
                if ($optionAText instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText) {
                    $optionAText = $optionAText->getPlainText();
                }
                $optionAText = addslashes($optionAText);

                $optionAValue = $this->extractNumber($data[2]);

                // 处理可能是RichText对象的情况
                $optionBText = $data[3];
                if ($optionBText instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText) {
                    $optionBText = $optionBText->getPlainText();
                }
                $optionBText = addslashes($optionBText);

                $optionBValue = $this->extractNumber($data[4]);

                // 生成SQL
                $sqlInserts[] = sprintf(
                    "('%s','%s',%d, %d,'%s',%d,%d)",
                    '在以下两种情境中，哪一种更符合您的行为模式或感受？',
                    $optionAText,
                    $optionAValue,
                    1,
                    $optionBText,
                    $optionBValue,
                    1
                );
            }

            // 4. 组合完整SQL
            $fullSql = $sqlHeader;
            $fullSql .= "INSERT INTO enneagram_questions 
                (title, option_a_text, option_a_type,option_a_weight, option_b_text, option_b_type,option_b_weight) VALUES\n";
            $fullSql .= implode(",\n", $sqlInserts) . ";";

            // 5. 写入文件
            file_put_contents($outputFile, $fullSql);

            $output->writeln("<info>SQL文件已成功生成: {$outputFile}</info>");
            return 0;
        } catch (Exception $e) {
            $output->writeln("<error>处理失败: " . $e->getMessage() . "</error>");
            return 1;
        }
    }
    /**
     * 从字符串中提取数字（例如："4号（E列）" → 4）
     */
    private function extractNumber($str)
    {
        // 处理RichText对象
        if ($str instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText) {
            $str = $str->getPlainText();
        }

        preg_match('/\d+/', $str, $matches);
        return isset($matches[0]) ? (int)$matches[0] : 0;
    }
}
